package com.bfl.sa.personal.message.service;

import com.bfl.sa.personal.message.entity.Message;
import com.bfl.sa.personal.message.entity.MessageState;
import com.bfl.sa.common.mybatis.entity.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;


public interface MessageApi {
    String REPLY_PREFIX = "回复：";
    String FOWRARD_PREFIX = "转发：";
    String FOWRARD_TEMPLATE = "<br/><br/>-----------转发消息------------<br/>发件人:%s<br/>收件人：%s<br/>标题：%s<br/><br/>%s";

    /**
     * 得到用户 指定状态的消息
     */
    Page<Message> findUserMessage(Long userId, MessageState state, Pageable pageable);

    /**
     * 查询消息的祖先 和 后代
     */
    List<Message> findAncestorsAndDescendants(Message message);

    /**
     * 保存草稿
     */
    void saveDraft(Message message);

    /**
     * 发送消息
     */
    void send(Message message);

    /**
     * 发送系统消息给多个人
     */
    void sendSystemMessage(Long[] receiverIds, Message message);

    /**
     * 发送系统消息给所有人
     */
    void sendSystemMessageToAllUser(Message message);

    /**
     * 将消息移动到垃圾箱
     */
    void recycle(Long userId, Long messageId);

    /**
     * 批量将消息移动到垃圾箱
     */
    void recycle(Long userId, Long[] messageIds);

    /**
     * 将消息保存到收藏箱
     */
    void store(Long userId, Long messageId);

    /**
     * 批量将消息保存到收藏箱
     */
    void store(Long userId, Long[] messageIds);

    /**
     * 从垃圾箱删除消息
     */
    void delete(Long userId, Long messageId);

    /**
     * 从垃圾箱删除消息
     */
    void delete(Long userId, Long[] messageIds);

    /**
     * 清空指定状态的消息
     */
    void clearBox(Long userId, MessageState state);

    /**
     * 清空草稿箱
     */
    void clearDraftBox(Long userId);

    /**
     * 清空收件箱
     */
    void clearInBox(Long userId);

    /**
     * 清空收件箱
     */
    void clearOutBox(Long userId);

    /**
     * 清空收藏箱
     */
    void clearStoreBox(Long userId);

    /**
     * 清空垃圾箱
     */
    void clearTrashBox(Long userId);

    /**
     * 未读收件箱消息总数
     */
    Long countUnread(Long userId);

    /**
     * 标识为已读
     */
    void markRead(Message message);

    /**
     * 标识为已回复
     */
    void markReplied(Message message);


    void markRead(Long userId, Long[] ids);
}
